/**
 * 写在vuex中，根据 异步路由表asyncRoutes 和 路由权限 得到用户可以访问到的 路由表 
 * baseRoute 为router.js中 不需要 权限的路由表，基础路由表
 * asyncRoutes 为router.js中 需要 权限的路由表，异步路由表
 */
 import { baseRoute, asyncRoutes } from '@/router';
//  state 
 const state = {
   routes: [],
   asyncRoutes:[],// 添加的动态路由addRoute的回调函数数组，用于重置路由
 };
//  mutations
 const mutations = {
   SET_ROUTES(state, route) {
     state.routes = baseRoute.concat(route); // 需要基础路由加上计算出来的路由
    //  state.asyncRoutes = route
     console.log("SET_ROUTES")
     console.log(state.routes)
   },
   SET_ASYNCROUTES(state,data){
    state.asyncRoutes = data
   }
 };
//  action
const actions = {
  GenerateRoutes({ commit }, data) {  //data：用户的路由权限
    return new Promise(resolve => {
      const roles = data;
      const accessedRouters = filterAsyncRoutes(asyncRoutes, roles)
      commit('SET_ROUTES', accessedRouters);
      resolve(accessedRouters)  // resolve用户可以访问的 路由表

    })
  }
}

/**
 * 递归筛选 异步路由表，返回有权限访问的路由
 * @param routes 异步路由表
 * @param roles 权限
 */
export function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }  // 浅拷贝对象
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)  // 递归子路由
      }
      res.push(tmp) // 有权限则加入res
    }
  })

  return res
}

/**
 * 判断 是否有权限访问 route 
 * @param roles 权限
 * @param route 单个路由
 */
 function hasPermission(roles, route) {
  if (route.meta && route.meta.role) {
    return roles.some(role => route.meta.role.includes(role)) // 判断路由的meta.role和roles是否匹配上
    // return roles.includes(route.meta.role) // 判断路由的meta.role和roles是否匹配上
  } else {
    return true
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
